home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Magazin: Amiga-CD 1996 May & June
/
Amiga-CD 1996 #5-6.iso
/
kommunikation
/
ipdial
/
vsscanf.c
< prev
Wrap
C/C++ Source or Header
|
1996-03-22
|
5KB
|
204 lines
/**
*** IPDial Script program for initializing a SLIP connection
*** Copyright (C) 1994 Jochen Wiedmann
***
*** This program is free software; you can redistribute it and/or modify
*** it under the terms of the GNU General Public License as published by
*** the Free Software Foundation; either version 2 of the License, or
*** (at your option) any later version.
***
*** This program is distributed in the hope that it will be useful,
*** but WITHOUT ANY WARRANTY; without even the implied warranty of
*** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
*** GNU General Public License for more details.
***
*** You should have received a copy of the GNU General Public License
*** along with this program; if not, write to the Free Software
*** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
***
***
***
*** This file implements a function very similar to sscanf().
***
***
*** Computer: Amiga 1200 Compiler: Dice 3.01
***
*** Author: Jochen Wiedmann
*** Am Eisteich 9
*** 72555 Metzingen
*** Germany
***
*** Phone: (+0049) 7123 / 14881
*** Internet: wiedmann@neckar-alb.de
**/
/**
*** Include files
**/
#ifndef IPDIAL_H
#include "IPDial.h"
#endif
#include <ctype.h>
/**
*** Scan the character buf for a string like %} and terminate it
*** with a '\0'. Return the pointer after %}
**/
STRPTR ReadWord(STRPTR buf, UBYTE c)
{ while(*buf)
{ if (*buf == '%')
{ char *ptr;
if (buf[1] == c)
{ *buf = '\0';
return(buf+2);
}
ptr = (char*) buf;
while (ptr[1])
{ *ptr = ptr[1];
++ptr;
}
*ptr = '\0';
}
else
{ ++buf;
}
}
return(buf);
}
/**
*** This is a function very similar to sscanf: A buffer is scanned
*** according to a format string.
***
*** The format string is interpreted as follows:
***
*** - The sequence %{WORD%} means any number of characters until the
*** word WORD is found. (Use %% to include the character '%'
*** into WORD itself.
*** - A blank means any number (including 0) and kind (blank, tab,
*** return, line feed, form feed) of white space characters.
*** - The sequence %[VAR%]%(SUFFIX%) means to store the following
*** white space separated word into the environment variable VAR.
*** The optional SUFFIX will be removed, if it is present.
***
*** Other characters are simply ignored.
***
*** The function returns the number of environment variables created.
**/
LONG Vsscanf(STRPTR buffer, STRPTR format, ULONG flags)
{ char *buf, *fmt;
int result;
/* Copy strings, so that we can modify them. */
if (!(buf = strdup((char*) buffer)) ||
!(fmt = strdup((char*) format)))
{ perror("malloc");
exit(10);
}
buffer = (STRPTR) buf;
format = (STRPTR) fmt;
result = 0;
while (*fmt && *buf)
{ if (isspace(*fmt))
{ while (isspace(*buf))
{ ++buf;
}
++fmt;
}
else if (*fmt == '%')
{ ++fmt;
if (*fmt == '{')
{ char *word;
int len;
/* Read word to match */
word = fmt+1;
fmt = (char*) ReadWord((STRPTR) word, '}');
len = strlen(word);
/* Word read, look into buffer */
if (!len)
{ continue;
}
while (*buf && strncmp(buf, word, len) != 0)
{ ++buf;
}
if (*buf)
{ buf += len;
}
}
else if (*fmt == '[')
{ char *var, *val, *suffix;
/* Read variable name. */
var = fmt+1;
fmt = (char*) ReadWord((STRPTR) var, ']');
/* Read suffix */
if (strncmp(fmt, "%(", 2) == 0)
{ suffix = fmt+2;
fmt = (char*) ReadWord((STRPTR) suffix, ')');
}
else
{ suffix = "";
}
/* Read next word from buffer */
val = buf;
while (*buf && !isspace(*buf))
{ ++buf;
}
if (*buf)
{ *buf = '\0';
++buf;
}
/* Check for suffix */
if (strlen(suffix) < strlen(val) &&
strcmp(val + strlen(val) - strlen(suffix), suffix) == 0)
{ val[strlen(val) - strlen(suffix)] = '\0';
}
/* Set environment variable */
if (*var)
{ if (VerboseMode)
{ fprintf(stderr, "Setting environment variable %s to value %s.\n",
var, val);
}
if (!setvar((STRPTR) var, (STRPTR) val, flags))
{ fprintf(stderr, "Error while setting environment variable %s to value %s.\n",
var, val);
}
++result;
}
}
else
{ /* Ignore this character. */
++fmt;
}
}
else
{ ++fmt; /* Ignore this character */
}
}
free(buffer);
free(format);
return(result);
}